﻿#region 命名空间

using System;
using System.Collections.Generic;
using Sharp.Domain.PlatformBoundedContext.PermissionModule.Aggregates;
using Sharp.Domain.PlatformBoundedContext.UserModule.Aggregates;
using Sharp.Infrastructure;

#endregion

namespace Sharp.Domain.PlatformBoundedContext.UserModule.Services
{
    /// <summary>
    ///     表示继承于该接口的类型都是领域服务（Domain Service）类型。
    /// </summary>
    public partial interface IUserService
    {
        /// <summary>
        /// 记录登录信息
        /// </summary>
        /// <param name="user"></param>
        /// <returns></returns>
        Result<User> TryLogin(User user);

        /// <summary>
        ///     确定指定的用户名是否存在。
        /// </summary>
        /// <param name="userName">待确定的用户名。</param>
        /// <returns>如果用户名存在，则返回true，否则返回false。</returns>
        bool UserNameExists(string userName);

        /// <summary>
        ///     确定指定的电子邮件地址是否存在。
        /// </summary>
        /// <param name="email">待确定的电子邮件地址。</param>
        /// <returns>如果电子邮件地址存在，则返回true，否则返回false。</returns>
        bool EmailExists(string email);

        /// <summary>
        ///     确定指定的用户名和密码是否一致。
        /// </summary>
        /// <param name="userName">待确定的用户名。</param>
        /// <param name="password">待确定的密码。</param>
        /// <returns>如果两者一致，则返回true，否则返回false。</returns>
        bool CheckPassword(string userName, string password);

        /// <summary>
        ///     根据指定的用户名，获取用户实体。
        /// </summary>
        /// <param name="userName">需要获取的用户的用户名。</param>
        /// <returns>用户实体。</returns>
        User GetUserByName(string userName);

        /// <summary>
        ///     根据指定的电子邮件地址，获取用户实体。
        /// </summary>
        /// <param name="email">需要获取的用户的电子邮件地址。</param>
        /// <returns>用户实体。</returns>
        User GetUserByEmail(string email);

        /// <summary>
        ///     获取用户的权限
        /// </summary>
        /// <param name="username"></param>
        /// <returns></returns>
        IEnumerable<Permission> GetPermissionByUserName(string username);
        /// <summary>
        ///     获取用户的权限
        /// </summary>
        /// <param name="uid"></param>
        /// <returns></returns>
        IEnumerable<Permission> GetPermissionById(Guid uid);

        #region 方法

        /// <summary>
        ///     保存权限
        /// </summary>
        /// <param name="ids"></param>
        /// <param name="owner"></param>
        /// <param name="ownerId"></param>
        Result SavePermission(IList<Guid> ids, string owner, Guid ownerId);

        /// <summary>
        ///     将指定的用户赋予特定的角色。
        /// </summary>
        /// <param name="user">用户实体。</param>
        /// <param name="role">角色实体。</param>
        /// <returns>用以表述用户及其角色之间关系的实体。</returns>
        User AssignRole(User user, Role role);

        /// <summary>
        ///     将指定的用户从角色中移除。
        /// </summary>
        /// <param name="user">用户实体。</param>
        /// <param name="role">角色实体，若为NULL，则表示从所有角色中移除。</param>
        void UnassignRole(User user, Role role = null);
        /// <summary>
        /// 关联用户到用户组
        /// </summary>
        /// <param name="userGroupId">用户组Id</param>
        /// <param name="userIds">用户Id</param>
        /// <returns></returns>
        Result RelationUser(Guid userGroupId, Guid[] userIds);

        /// <summary>
        /// 反关联用户组的用户
        /// </summary>
        /// <param name="userGroupId">用户组Id</param>
        /// <param name="userIds">用户Id</param>
        /// <returns></returns>
        Result UnRelationUser(Guid userGroupId, Guid[] userIds);
        /// <summary>
        /// 授权的组织
        /// </summary>
        /// <returns></returns>
        List<Guid> GetAuthorizedOrgIds();

        #endregion
    }
}